#include "stm32f10x.h"                  // STM32F10x 设备头文件
#include "stm32f10x_tim.h"              // TIM 外设头文件
#include "stm32f10x_rcc.h"              // RCC 外设头文件

extern int num;
int i,j;

void TIM4_int_init(void){
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	
	TIM_InternalClockConfig(TIM4); //使用内部时钟
	TIM_TimeBaseInitTypeDef my_timer;
	my_timer.TIM_CounterMode=TIM_CounterMode_Up;
	my_timer.TIM_Period=720;
	my_timer.TIM_Prescaler=100;
	TIM_TimeBaseInit(TIM4,&my_timer);
	
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);

//定时器中断
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef my_nvic_init;
	my_nvic_init.NVIC_IRQChannel=TIM4_IRQn;
	my_nvic_init.NVIC_IRQChannelCmd=ENABLE;
	my_nvic_init.NVIC_IRQChannelPreemptionPriority=1;
	my_nvic_init.NVIC_IRQChannelSubPriority=1;
	
	NVIC_Init(&my_nvic_init);
	
	TIM_Cmd(TIM4,ENABLE);
	
//	void TIM4_IRQHandler(){
//	if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)
//	{
//		ms 中断
//		TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
//	}
//	
//}
}


/**
 * @brief  使用定时器2实现微秒级延迟
 * @param  us: 延迟的微秒数
* @retval 不能和ms一起使用
 */
void delay_us(uint32_t us)
{
	if(!j){
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  // 使能TIM4时钟
    TIM_InternalClockConfig(TIM4);  // 选择内部时钟源
		
		
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 1;              
    TIM_TimeBaseStructure.TIM_Prescaler = 719;            // 72MHz / 720 = 100kHz，计数频率100kHz
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 	// 初始化TIM4
		j=1;
	}
		TIM_SetAutoreload(TIM4, us/10);               // 设置计数周期为us/10 (100kHz计数频率)
    TIM_SetCounter(TIM4, 0);                              // 计数器清零
    TIM_Cmd(TIM4, ENABLE);																// 启动TIM4
	
	
    while (!TIM_GetFlagStatus(TIM4, TIM_FLAG_Update));   // 等待更新事件
    TIM_ClearFlag(TIM4, TIM_FLAG_Update);                // 清除更新标志
    TIM_Cmd(TIM4, DISABLE);                              // 停止TIM4
}

/**
 * @brief  使用定时器2实现毫秒级延迟
 * @param  ms: 延迟的毫秒数
* @retval 不能和us一起使用
 */
void delay_ms(uint32_t ms)
{  

    if (!i) {
        // 首次调用时进行初始化
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  // 使能TIM4时钟
        TIM_InternalClockConfig(TIM4);  // 选择内部时钟源

        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_TimeBaseStructure.TIM_Period = 1; 
        TIM_TimeBaseStructure.TIM_Prescaler = 7199;  
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);      // 初始化TIM4

        i = 1;  // 标记为已初始化
    }

    // 设置延时周期
    TIM_SetAutoreload(TIM4, ms * 10);  // 设置计数周期为ms*10 (10kHz计数频率)
    TIM_SetCounter(TIM4, 0);           // 计数器清零
    TIM_Cmd(TIM4, ENABLE);            // 启动TIM4

    while (!TIM_GetFlagStatus(TIM4, TIM_FLAG_Update));  // 等待更新事件
    TIM_ClearFlag(TIM4, TIM_FLAG_Update);               // 清除更新标志
    TIM_Cmd(TIM4, DISABLE);                             // 停止TIM4
}
